public class VarArgsOptionalTrailing {
    // 使用一个指定的、非Object类型的可变参数列表
    static void f(int required, String... trailing) {
        System.out.print("required: " + required);
        for (String s : trailing) {
            System.out.print(", " + s);
        }
        System.out.println();
    }


    public static void main(String[] args) {
        f(1, "one");
        f(2, "two", "three");
        f(0);
    }
}

class VarargType {
    static void char_type(Character... args) {
        System.out.print(args.getClass());
        System.out.println(" length = " + args.length);
    }

    static void integer_type(Integer... args) {
        System.out.print(args.getClass());
        for (Integer i : args) {
            System.out.print(" " + i);
        }
        System.out.println(" length = " + args.length);
    }

    static void int_type(int... args) {
        System.out.print(args.getClass());
        System.out.println(" length = " + args.length);
    }
}

class TestVarargType {
    public static void main(String[] args) {
        VarargType.char_type('a');
        VarargType.char_type();
        VarargType.integer_type(1);
        VarargType.integer_type(1, 2, 3);
        VarargType.integer_type();
        VarargType.int_type(1);
        VarargType.int_type();
        // 使用可变参数列表不依赖于自动装箱
        System.out.println("int[]: " + new int[10].getClass());
        /*
        class [Ljava.lang.Character; length = 1
        class [Ljava.lang.Character; length = 0
        class [Ljava.lang.Integer; 1 length = 1
        class [Ljava.lang.Integer; 1 2 3 length = 3
        class [Ljava.lang.Integer; length = 0
        class [I length = 1
        class [I length = 0
        int[]: class [I
         */
    }
}

/*
.getClass()：调用数组对象的 getClass() 方法，返回表示该数组类型的 Class 对象
在 Java 中，数组属于特殊的对象类型，其运行时类名由 [（表示数组）和类型描述符组成。
[I 表示一个 int 类型的一维数组。
[ 表示这是一个数组。
I 是 int 类型在 JVM 中的类型描述符。

Java 类型    描述符
boolean     Z
byte        B
char        C
double      D
float       F
int         I
long        J
short       S
Object      Ljava/lang/Object;
 */
